iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Python

pythonGUI學習筆記系列 第 23

Day 23: PySide6 播放影片

  • 分享至 

  • xImage
  •  

QVideoWidget 和 QMediaPlayer 和 QAudioOutput

  1. QMediaPlayer : 負責處裡音頻與影片的播放控制。它的功能有 :

    • 加載音頻和影片文件
    • 播放、暫停、停止等功能
    • 管理播放內容的進度

    雖然可以控制播放的內容,可是他不能直接顯示內容,所以需要配合 QVideoWidget 顯示畫面。

  2. QVideoWidget : 專門用來顯示影片畫面的視窗部件。QVideoWidget 本身不能處理任何影片,它的功能只有播放,所以要使用的話,要配合 QMediaPlayer 。

  3. QAudioOutput:負責音頻的輸出控制

    • 控制音量
    • 管理音頻輸出設備

    在使用 QMediaPlayer 播放音頻或視頻時,通常會搭配 QAudioOutput 來控制音頻的輸出。

常用功能

  1. QMediaPlayer 功能
  • positionChanged.connect(function) : 當影片的位置改變時,會觸發信號。傳入函數時會傳入影片當前的位置。
  • setVideoOutput(QVideoWidget) : 將 QVideoWidget 設置為影片的輸出目標。
  • setAudioOutput(QAudioOutput) : 將 QAudioOutput 設置為聲音的輸出目標。
  • msetSource(path) : 設定播放資源,要給影片的路徑。
  • PlayingState : 會回傳播放的狀態
  • duration() : 回傳影片長度。
  • 播放、暫停和停止
功能 方法
播放 play()
暫停 pause()
停止 stop()
  1. QAudioOutput 功能
  • setVolume(float) : 調整音量,範圍在 0 到 1 , 所以如果今天設計的滑條是 0 到 100 就需要調整。

範例

下面範例是設定一個 QSlider 控制音量大小 , 然後設定按鈕進行播放和暫停。並設置一個進度條,去做影片的時間長短。

  1. 引入需要的東西
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QSlider, QHBoxLayout, QProgressBar
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput
from PySide6.QtMultimediaWidgets import QVideoWidget
from PySide6.QtCore import Qt
  1. 初始化播放器
    # 播放器初始化
    def init_media_player(self):
        self.mediaPlayer = QMediaPlayer()
        self.audioOutput = QAudioOutput()
        self.videoWidget = QVideoWidget()
        self.mediaPlayer.setAudioOutput(self.audioOutput)
        self.mediaPlayer.setVideoOutput(self.videoWidget)
  1. 把介面排版和添加元件
    # 元件創建
    def init_ui(self):
        layout = QVBoxLayout()
        layout.addWidget(self.videoWidget)
        controlLayout = QHBoxLayout()

        self.playButton = QPushButton("播放")
        self.playButton.clicked.connect(self.toggle_playback)
        controlLayout.addWidget(self.playButton)

        self.volumeSlider = QSlider(Qt.Horizontal)
        self.volumeSlider.setRange(0, 100)
        self.volumeSlider.setValue(100)
        self.volumeSlider.valueChanged.connect(self.set_volume)
        controlLayout.addWidget(self.volumeSlider)

        self.progressBar = QProgressBar()
        self.progressBar.setRange(0, 100)
        controlLayout.addWidget(self.progressBar)

        layout.addLayout(controlLayout)
        self.setLayout(layout)
  1. 控制影片動作和控制音量。
  • play_video 函數 : 用 setSource(path) 來設定播放路徑,還有播放影片。
  • toggle_playback 函數 : 設定的暫停和播放
  • set_volume 函數 : 設定影片的音量,要注意 setVolume 裡面是 0 到 1 所以要除以 100 。
    # 媒體控制功能
    def play_video(self):
        self.mediaPlayer.setSource("Payphone.mp4")
        self.mediaPlayer.play()

    def toggle_playback(self):
        if self.mediaPlayer.playbackState() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
            self.playButton.setText("播放")
        else:
            self.mediaPlayer.play()
            self.playButton.setText("暫停")

    def set_volume(self, value):
        self.audioOutput.setVolume(value / 100)
  1. 設定進度條,如果大於零就會播放。因為進度條設置的是百分比,所以要做處理。
    # 進度條更新
    def update_progress(self,position):
        if self.mediaPlayer.duration() > 0:
            progress = position / self.mediaPlayer.duration() * 100
            self.progressBar.setValue(progress)
  1. 別忘了要寫在窗口裡面,放到MyWindow
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init_media_player()
        self.init_ui()
        self.play_video()
        self.mediaPlayer.positionChanged.connect(self.update_progress)
  1. 執行
if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    window.resize(600,600)
    app.exec()

總結

  • 播放影片的三元件

    • QMediaPlayer : 負責控這影片的功能(暫停、開啟)。
    • QVideoWidget : 負責顯示影片的視窗。
    • QAudioOutput : 負責音頻的輸出控制。
  • 常用功能

    • QMediaPlayer 功能
功能 方法
播放 play()
暫停 pause()
停止 stop()
設定播放資源 msetSource(path)
回傳播放狀態 PlayingState()
回傳影片長度 duration()
設定影片輸出 setVideoOutput(QVideoWidget)
設定聲音輸出 setAudioOutput(QAudioOutput)
影片位置改變時觸發信號 positionChanged.connect(function)
  • QAudioOutput 功能
功能 方法
設定音量 setVolume(float)

上一篇
Day 22 PySide6 子窗口
下一篇
Day 24: PySide6 QPaint 和 QPen 繪圖
系列文
pythonGUI學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言